const Question = require('../models/questions.js');

class QuestionsCtl {
    //获取所有问题数据
    async find(ctx) {
        const { per_page = 10 } = ctx.query;
        const page = Math.max(ctx.query.page * 1, 1) - 1;
        const perPage = Math.max(per_page * 1, 1);
        const q = new RegExp(ctx.query.q);
        ctx.body = await Question
          .find({ $or: [{ title: q }, { description: q }] })
          .limit(perPage).skip(page * perPage);
    }
    //检查问题是否存在
    async checkQuestionExist(ctx, next) {
        const question = await Question.findById(ctx.params.id).select('+questioner');
        if (!question) { ctx.throw(404, '问题不存在'); }
        ctx.state.question = question;
        await next();
    }
    //获取指定问题数据
    async findById(ctx) {
        const { fields = '' } = ctx.query;
        const selectFields = fields.split(';').filter(f => f).map(f => ' +' + f).join('');
        const question = await Question.findById(ctx.params.id).select(selectFields).populate('questioner topics');
        ctx.body = question;
    }
    //创建问题
    async create(ctx) {
        ctx.verifyParams({
          title: { type: 'string', required: true },
          description: { type: 'string', required: false },
        });
        console.log()
        const question = await new Question({ ...ctx.request.body, questioner: ctx.state.user._id }).save();
        ctx.body = question;
    }

    async checkQuestioner(ctx, next) {
        const { question } = ctx.state;
        if (question.questioner.toString() !== ctx.state.user._id) { ctx.throw(403, '没有权限'); }
        await next();
    }
    //更新数据
    async update(ctx) {
        ctx.verifyParams({
          title: { type: 'string', required: false },
          description: { type: 'string', required: false },
        });
        await ctx.state.question.update(ctx.request.body);
        ctx.body = ctx.state.question;
    }
    //删除数据
    async delete(ctx) {
        await Question.findByIdAndRemove(ctx.params.id);
        ctx.status = 204;
    }
}

module.exports = new QuestionsCtl();